package com.example.springboottest.example.zookeeper.distributedLock;

/**
 * 使用 ZooKeeper 实现分布式锁的算法，流程大致如下：
 * （1）一把锁，使用一个 ZNode 节点表示，如果锁对应的 ZNode 节点不存在，那么先创建 ZNode节点。
 *     这里假设为“/test/lock”，代表了一把需要创建的分布式锁。
 * （2）抢占锁的所有客户端，使用锁的 ZNode 节点的子节点列表来表示；如果某个客户端需要占用锁，则在“/test/lock”下创建一个临时有序的子节点。
 *      这里，所有子节点尽量共用一个有意义的子节点前缀。
 *      如果子节点前缀为“ /test/lock/seq- ”，则第一个客户端对应的子节点为
 *      “/test/lock/seq-000000000”，第二个为“/test/lock/seq-000000001”，以此类推。
 *      如果子节点前缀为“/test/lock/”，则第一个客户端对应的子节点为“/test/lock/000000000”，
 *      第二个为“/test/lock/000000001”，以此类推，也非常直观。
 * （3）如果判定客户端是否占有锁呢？很简单，客户端创建子节点后，需要进行判断：自己创建的子节点是否为当前子节点列表中序号最小的子节点。
 *      如果是，则认为加锁成功；如果不是，则监听前一个 ZNode 子节点的变更消息，等待前一个节点释放锁。
 * （4）一旦队列中后面的节点获得前一个子节点的变更通知，则开始进行判断，判断自己是否为当前子节点列表中序号最小的子节点，
 *      如果是，则认为加锁成功；如果不是，则持续监听，一直到获得锁。
 * （5）获取锁后，开始处理业务流程。在完成业务流程后，删除自己对应的子节点，完成释放锁的工作，以便后面的节点能捕获到节点的变更通知，获得分布式锁。
 */
public interface Lock {
    /**
     * 加锁方法
     *
     * @return 是否成功加锁
     */
    boolean lock();

    /**
     * 解锁方法
     *
     * @return 是否成功解锁
     */
    boolean unlock();
}